<?php
class Contra {
  function __construct() {
  }

  public function select() {
  
    $data = new jqGridData();
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Есть ли права на просмотр чьих либо записей
		$rwd = $_SESSION['priv']->contra->rwd;
		if( ($rwd & PERM_BITS::READ_ANY) == 0 ) throw new Exception(ERR_M::DATA_ACC_DISABLED, 99);

// Проверяем данные
        $page    = ( isset($_REQUEST["page"]) && $_REQUEST["page"] > 0 ) ? $_REQUEST["page"] : 1;
        $limit    = ( isset($_REQUEST["rows"]) && $_REQUEST["rows"] > 0 ) ? $_REQUEST["rows"] : 1;
        $sidx    = ( isset($_REQUEST["sidx"]) && $_REQUEST["sidx"] != '' ) ? $_REQUEST["sidx"] : 'cont_name';
        $sord    = ( isset($_REQUEST["sord"]) && strtolower($_REQUEST["sord"]) == 'desc' ) ? 'DESC' : 'ASC';
        $search    = ( isset($_REQUEST["_search"]) && strtolower($_REQUEST["_search"]) == 'true') ? true : false;
    
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр
        $whc = array();
        if( $search )
        {
            if(isset($_REQUEST["cont_id"]) && is_numeric($_REQUEST["cont_id"]) ) {
				$whc[] = "cont_id=" . $db->quote($_REQUEST["cont_id"]);
		    }
            
            if(isset($_REQUEST["cont_name"]) && $_REQUEST["cont_name"] != "") {
		    	$whc[] = "cont_name LIKE " . $db->quote("%".$_REQUEST["cont_name"]."%");
            }

            if(isset($_REQUEST["cont_address"]) && $_REQUEST["cont_address"] != "") {
		    	$whc[] = "cont_address LIKE " . $db->quote("%".$_REQUEST["cont_address"]."%");
            }
			
            if(isset($_REQUEST["cont_phone"]) && $_REQUEST["cont_phone"] != "") {
		    	$whc[] = "cont_phone LIKE " . $db->quote("%".$_REQUEST["cont_phone"]."%");
            }
			
            if(isset($_REQUEST["cont_fax"]) && $_REQUEST["cont_fax"] != "") {
		    	$whc[] = "cont_fax LIKE " . $db->quote("%".$_REQUEST["cont_fax"]."%");
            }
			
            if(isset($_REQUEST["cont_mobile"]) && $_REQUEST["cont_mobile"] != "") {
		    	$whc[] = "cont_mobile LIKE " . $db->quote("%".$_REQUEST["cont_mobile"]."%");
            }
			
            if(isset($_REQUEST["cont_mail"]) && $_REQUEST["cont_mail"] != "") {
		    	$whc[] = "cont_mail LIKE " . $db->quote("%".$_REQUEST["cont_mail"]."%");
            }
			
            if(isset($_REQUEST["cont_www"]) && $_REQUEST["cont_www"] != "") {
		    	$whc[] = "cont_www LIKE " . $db->quote("%".$_REQUEST["cont_www"]."%");
            }
			
            if(isset($_REQUEST["cont_person"]) && $_REQUEST["cont_person"] != "") {
		    	$whc[] = "cont_person LIKE " . $db->quote("%".$_REQUEST["cont_person"]."%");
            }
			
            if(isset($_REQUEST["cont_nds"]) && $_REQUEST["cont_nds"] != "") {
				if( $_REQUEST["cont_nds"] === '0' || $_REQUEST["cont_nds"] === '1' )
					$whc[] = "cont_nds = " . $db->quote($_REQUEST["cont_nds"]);
            }
			
		}

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whc[] = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whc[] = 'cont_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whc[] = 'cont_user_id = '.$_SESSION['user_id'];
		else $whc[] = '1 = 0';
		
        $whereclaus = (count($whc) != 0 ) ? " WHERE " . implode(" AND ", $whc) : "";
		unset($whc);
            
// Получаем количество записей с учетом фильтра
        $recset = $db->query( "SELECT COUNT(*) as count FROM contra" . $whereclaus );
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		$count = $row['count'];
		$recset->closeCursor();
            
// Пустая таблица
        if ($count == 0)
			throw new Exception(ERR_M::SUCCESS, 0);
            
// Рассчитаем сколько всего страниц займут данные в БД
    	if( $count > 0 && $limit > 0) {
    		$total_pages = ceil($count/$limit);
    	} else {
    		$total_pages = 0;
    	}                  
 
		if ($page > $total_pages) $page=$total_pages;                  
 
		$start = $limit*$page - $limit;                   
		if($start < 0) $start = 0;                  
 
// Формируем запрос
		$sqlreq =   "SELECT * FROM contra".$whereclaus." ORDER BY ".$sidx." ".$sord.
		            " LIMIT ".$start.", ".$limit;

		$recset = $db->query($sqlreq);                  
 
// Формирование объекта для возврата
        
    	$data->page      = $page;
    	$data->total     = $total_pages;
    	$data->records   = $count;
    		
    // Строки данных для таблицы
		$i = 0;
		while($row = $recset->fetch(PDO::FETCH_ASSOC)) {
			if(is_bool($phone = Tools::phone_humanity($row['cont_phone'])) ) $phone = '';
			if(is_bool($fax = Tools::phone_humanity($row['cont_fax'])) ) $fax = '';
			if(is_bool($mobile = Tools::phone_humanity($row['cont_mobile'])) ) $mobile = '';
			$data->rows[$i]['id'] = $row['cont_id'];
			$data->rows[$i]['cell'] = array(
					$row['cont_id'],
				    $row['cont_name'],
				    $row['cont_address'],
					$phone,
					$fax,
					$mobile,
					$row['cont_mail'],
					$row['cont_www'],
					$row['cont_person'],
					$row['cont_nds'],
		    );
		    $i++;
		}
    }
	catch (PDOException $e) {
		$data->userdata->errcode = 1;
		$data->userdata->errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$data->userdata->errcode = $e->getCode();
		$data->userdata->errmess = $e->getMessage();
	}
 
	return $data;
  }
  
  
  public function find() {
	$errcode = 0;
	$errmess = '';
    $data = array();
	
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Find - услуга общего пользования. Поэтому, маска должна быть READ_ANY
		$rwd = $_SESSION['priv']->contra->rwd;
		if( ( $rwd & PERM_BITS::READ_ANY ) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Проверяем данные
        $term   = isset($_REQUEST["term"]) ? trim(strip_tags($_REQUEST["term"])) : '';
        if ($term == '')
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
   
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whs = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whs = 'cont_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whs = 'cont_user_id = '.$_SESSION['user_id'];
		else $whs = '1 = 0';
		
// Формируем запрос
		$sqlreq =   "SELECT * FROM contra WHERE cont_name LIKE ".$db->quote("%".$term."%").' AND '.$whs." ORDER BY cont_name";
		$recset = $db->query($sqlreq);                  
        while( $row = $recset->fetch(PDO::FETCH_ASSOC) ) {
            $unit = new stdClass;
            $unit->value = $row['cont_id'];

			$num = mb_strlen($term,'UTF-8');
			$pos = mb_stripos( $row['cont_name'], $term, 0, 'UTF-8');
			if( !is_bool($pos) ) {
				$bterm = mb_substr($row['cont_name'], $pos, $num, 'UTF-8');
				$name = preg_replace( '/'.$bterm.'/u', '<b>'.$bterm.'</b>', $row['cont_name'] );				
			} else $name = $row['cont_name'];

            $unit->name = $name;
			$unit->person = $row['cont_person'];
			$unit->nds = $row['cont_nds'];
			
            $data[] = $unit;
        }
        $recset->closeCursor();
 
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}
 
	return array('errcode'=>$errcode,'errmess'=>$errmess, 'data'=>$data);
  }
  
  
  public function insert() {

    $cont_name = isset($_POST['cont_name']) ? trim(strip_tags($_POST['cont_name'])) : '';
    $cont_address = isset($_POST['cont_address']) ? trim(strip_tags($_POST['cont_address'])) : '';
    $cont_phone = isset($_POST['cont_phone']) ? trim(strip_tags($_POST['cont_phone'])) : '';
    $cont_fax   = isset($_POST['cont_fax']) ? trim(strip_tags($_POST['cont_fax'])) : '';
    $cont_mobile = isset($_POST['cont_mobile']) ? trim(strip_tags($_POST['cont_mobile'])) : '';
    $cont_mail = isset($_POST['cont_mail']) ? trim(strip_tags($_POST['cont_mail'])) : '';
    $cont_www = isset($_POST['cont_www']) ? trim(strip_tags($_POST['cont_www'])) : '';
    $cont_person = isset($_POST['cont_person']) ? trim(strip_tags($_POST['cont_person'])) : '';
    $cont_nds = isset($_POST['cont_nds']) ? trim(strip_tags($_POST['cont_nds'])) : '';

	$errcode = 0;
	$errmess = '';
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$cont_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->contra->rwd;
		if( ($rwd & PERM_BITS::WRITE_OWN) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		if( $cont_name == '' ) $errdata = "Не указано имя контрагента.";
		if( $cont_address == '' ) $errdata .= ($errdata?'<br>':'').'Не указан адрес.';
		if( $cont_person == '' ) $errdata .= ($errdata?'<br>':'').'Не указан инициатор.';
		
		if( $cont_phone == '' ) 
				$errdata .= ($errdata?'<br>':'').'Не указан телефон.';
		elseif( ($cont_phone = Tools::phone_clearing( $cont_phone )) === false )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан телефон.';
				
		if( $cont_fax != '' && ($cont_fax = Tools::phone_clearing( $cont_fax )) === false )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан номер факса.';
				
		if( $cont_mobile != '' && ($cont_mobile = Tools::phone_clearing( $cont_mobile )) === false )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан номер мобильного.';
				
		if( $cont_mail !== '' && !Tools::is_mail_address( $cont_mail ) )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан e-mail.';
		
		if( $cont_www !== '' && !Tools::is_url_address( $cont_www ) )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан адрес WWW сайта.';
		
		if( $cont_nds !== '0' && $cont_nds !== '1' ) 
				$errdata .= ($errdata?'<br>':'').'Не указан признак НДС.';
				
		if( $errdata ) throw new Exception($errdata, 1);
		
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Может быть контрагент с указаным именем уже существует
		$cont_key1 = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $cont_name, 'UTF-8') );
		$cont_key2 = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $cont_address, 'UTF-8') );
		$cont_key  = substr( $cont_key1.' '.$cont_key2, 0, 64);
		$recset = $db->query('SELECT cont_name FROM contra WHERE cont_key = '.$db->quote($cont_key));                  
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
			$old_cont_name = $row['cont_name'];
			throw new Exception('Контрагент с именем "'.$old_cont_name.'" уже существует.', 1);
        }    
		$recset->closeCursor();

// Пишем данные
        $sqlreq = "INSERT INTO contra ( cont_name, cont_address, cont_phone, cont_fax, cont_mobile, ".
					"cont_mail, cont_www, cont_person, cont_nds, cont_key, cont_user_id ) ".
			"VALUES (". $db->quote($cont_name).", ".$db->quote($cont_address).", ".
						$db->quote($cont_phone).", ".$db->quote($cont_fax).", ".$db->quote($cont_mobile).", ".
						$db->quote($cont_mail).", ".$db->quote($cont_www).", ".
						$db->quote($cont_person).", ".$db->quote($cont_nds).", ".
						$db->quote($cont_key).", ".$db->quote($cont_user_id).")";
		$db->exec($sqlreq);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  
  
  public function update() {
	
    $cont_id	= isset($_POST['id']) ? trim(strip_tags($_POST['id'])) : '';
    $cont_name	= isset($_POST['cont_name']) ? trim(strip_tags($_POST['cont_name'])) : '';
    $cont_address = isset($_POST['cont_address']) ? trim(strip_tags($_POST['cont_address'])) : '';
    $cont_phone = isset($_POST['cont_phone']) ? trim(strip_tags($_POST['cont_phone'])) : '';
    $cont_fax   = isset($_POST['cont_fax']) ? trim(strip_tags($_POST['cont_fax'])) : '';
    $cont_mobile = isset($_POST['cont_mobile']) ? trim(strip_tags($_POST['cont_mobile'])) : '';
    $cont_mail = isset($_POST['cont_mail']) ? trim(strip_tags($_POST['cont_mail'])) : '';
    $cont_www = isset($_POST['cont_www']) ? trim(strip_tags($_POST['cont_www'])) : '';
    $cont_person = isset($_POST['cont_person']) ? trim(strip_tags($_POST['cont_person'])) : '';
    $cont_nds	= isset($_POST['cont_nds']) ? trim(strip_tags($_POST['cont_nds'])) : '';

	$errcode = 0;
	$errmess = '';
    try
    {
// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$cont_user_id = $_SESSION['user_id'];

// Есть ли разрешение на изменение чьей либо записи
		$rwd = $_SESSION['priv']->contra->rwd;
		if( ($rwd & PERM_BITS::WRITE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Все ли данные переданы
		$errdata = "";
		if( $cont_id == '' ) $errdata = "Не указан идентификатор контрагента.";
		if( $cont_name == '' ) $errdata .= ($errdata?'<br>':'')."Не указано имя контрагента.";
		if( $cont_address == '' ) $errdata .= ($errdata?'<br>':'').'Не указан адрес.';
		if( $cont_person == '' ) $errdata .= ($errdata?'<br>':'').'Не указан инициатор.';
		
		if( $cont_phone == '' ) 
				$errdata .= ($errdata?'<br>':'').'Не указан телефон.';
		elseif( ($cont_phone = Tools::phone_clearing( $cont_phone )) === false )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан телефон.';
				
		if( $cont_fax != '' && ($cont_fax = Tools::phone_clearing( $cont_fax )) === false )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан номер факса.';
				
		if( $cont_mobile != '' && ($cont_mobile = Tools::phone_clearing( $cont_mobile )) === false )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан номер мобильного.';
				
		if( $cont_mail !== '' && !Tools::is_mail_address( $cont_mail ) )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан e-mail.';
		
		if( $cont_www !== '' && !Tools::is_url_address( $cont_www ) )
				$errdata .= ($errdata?'<br>':'').'Неправильно указан адрес WWW сайта.';
		
		if( $cont_nds !== '0' && $cont_nds !== '1' ) 
				$errdata .= ($errdata?'<br>':'').'Не указан признак НДС.';
				
		if( $errdata ) throw new Exception($errdata, 1);
		
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Есть ли разрешение на апдейт этой записи
		if( $rwd & PERM_BITS::WRITE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::WRITE_GRP ) 
			$where = 'cont_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::WRITE_OWN ) $where = 'cont_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND cont_id = '.$db->quote($cont_id);
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM contra WHERE '.$where.' LIMIT 1';
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( !$row['count'] ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$recset->closeCursor();
		
// Может быть объект с указаным именем уже существует
		$cont_key1 = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $cont_name, 'UTF-8') );
		$cont_key2 = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $cont_address, 'UTF-8') );
		$cont_key  = substr( $cont_key1.' '.$cont_key2, 0, 64);

		$recset = $db->query('SELECT cont_name FROM contra WHERE cont_key = '.$db->quote($cont_key).' AND '.
			'cont_id != '.$db->quote($cont_id));                  
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
			$old_cont_name = $row['cont_name'];
			throw new Exception('Контрагент с именем "'.$old_cont_name.'" уже существует.', 1);
        }    
		$recset->closeCursor();

// Пишем данные
        $sqlreq = 	'UPDATE contra SET '.
					'cont_name = '.$db->quote($cont_name).', '.
					'cont_address = '.$db->quote($cont_address).', '.
					'cont_phone = '.$db->quote($cont_phone).', '.
					'cont_fax = '.$db->quote($cont_fax).', '.
					'cont_mobile = '.$db->quote($cont_mobile).', '.
					'cont_mail = '.$db->quote($cont_mail).', '.
					'cont_www = '.$db->quote($cont_www).', '.
					'cont_person = '.$db->quote($cont_person).', '.
					'cont_nds = '.$db->quote($cont_nds).', '.
					'cont_key = '.$db->quote($cont_key).' '.
					'WHERE cont_id = '.$db->quote($cont_id);

		$db->exec($sqlreq);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }
  
  
  public function delete() {
    $errmess = "";
	$errcode = 0;
		
    $cont_ids = (isset($_REQUEST['id']) && $_REQUEST['id'] != '') ?
        explode(",", $_REQUEST["id"], 100) : array();

    try
    {
// Только зарегистрированные пользователи могут удалять данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Есть ли разрешение на удаление хоть какой либо записи
		$rwd = $_SESSION['priv']->contra->rwd;
		if( ($rwd & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
        if (!Tools::is_numeric_array( $cont_ids ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
		$cont_id_list = implode(',', $cont_ids);

// Открываем базу данных
		$db = App::me()->dbOpen();	

// Есть ли разрешение на удаление этих записей
		if( $rwd & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::DELETE_GRP ) 
			$where = 'cont_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::DELETE_OWN ) $where = 'cont_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND cont_id IN ('.$cont_id_list.')';
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM contra WHERE '.$where;
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row['count'] != count($cont_ids) ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$recset->closeCursor();
		
// Проверяем, есть ли эти коды контрагентов в таблице расходов по обїектам/контрагентам.

		$errdata = '';
		$sqlreq = "SELECT COUNT(*) as count FROM incoming WHERE inc_cont_id IN (".$cont_id_list.")";
		$row = $db->query($sqlreq)->fetch(PDO::FETCH_ASSOC);
		if( $row['count'] != 0 ) {
			$errdata .= ($errdata?'<br>':'').'По контрагенту(ам) обнаружено '.$row['count'].
				' записей в таблице расходов по контрагентам.';
		}
		if( $errdata != '' )
			throw new Exception( $errdata, 1);


// Удаляем записи из справочника
        $sqlreq = "DELETE FROM contra WHERE cont_id IN (".$cont_id_list.")";
        $db->exec($sqlreq);
	}
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }
}
?>